package com.aspire.aimini.service;

import com.aspire.aimini.model.dto.UserDTO;
import com.aspire.aimini.model.entity.User;
import com.aspire.aimini.model.query.UserQuery;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;

/**
 * 用户服务接口
 *
 * @author wangguiyou
 * @date 2024-12-19
 * @description 用户业务逻辑接口
 */
public interface UserService extends IService<User> {

    /**
     * 用户注册
     *
     * @param userDTO 用户信息
     * @return 注册结果
     */
    boolean register(UserDTO userDTO);

    /**
     * 用户登录
     *
     * @param username 用户名
     * @param password 密码
     * @param loginIp  登录IP
     * @return JWT Token
     */
    String login(String username, String password, String loginIp);

    /**
     * 根据用户名查询用户
     *
     * @param username 用户名
     * @return 用户信息
     */
    User findByUsername(String username);

    /**
     * 根据邮箱查询用户
     *
     * @param email 邮箱
     * @return 用户信息
     */
    User findByEmail(String email);

    /**
     * 根据手机号查询用户
     *
     * @param phone 手机号
     * @return 用户信息
     */
    User findByPhone(String phone);

    /**
     * 分页查询用户列表
     *
     * @param query 查询条件
     * @return 分页结果
     */
    IPage<UserDTO> pageUsers(UserQuery query);

    /**
     * 根据ID查询用户详情
     *
     * @param id 用户ID
     * @return 用户信息
     */
    UserDTO getUserById(Long id);

    /**
     * 创建用户
     *
     * @param userDTO 用户信息
     * @return 创建结果
     */
    boolean createUser(UserDTO userDTO);

    /**
     * 更新用户信息
     *
     * @param id      用户ID
     * @param userDTO 用户信息
     * @return 更新结果
     */
    boolean updateUser(Long id, UserDTO userDTO);

    /**
     * 删除用户
     *
     * @param id 用户ID
     * @return 删除结果
     */
    boolean deleteUser(Long id);

    /**
     * 批量删除用户
     *
     * @param ids 用户ID列表
     * @return 删除结果
     */
    boolean batchDeleteUsers(List<Long> ids);

    /**
     * 启用/禁用用户
     *
     * @param id     用户ID
     * @param status 状态：0-禁用，1-启用
     * @return 更新结果
     */
    boolean updateUserStatus(Long id, Integer status);

    /**
     * 批量更新用户状态
     *
     * @param ids    用户ID列表
     * @param status 状态：0-禁用，1-启用
     * @return 更新结果
     */
    boolean batchUpdateUserStatus(List<Long> ids, Integer status);

    /**
     * 重置用户密码
     *
     * @param id          用户ID
     * @param newPassword 新密码
     * @return 重置结果
     */
    boolean resetPassword(Long id, String newPassword);

    /**
     * 修改密码
     *
     * @param id          用户ID
     * @param oldPassword 旧密码
     * @param newPassword 新密码
     * @return 修改结果
     */
    boolean changePassword(Long id, String oldPassword, String newPassword);

    /**
     * 检查用户名是否存在
     *
     * @param username  用户名
     * @param excludeId 排除的用户ID（用于更新时检查）
     * @return 是否存在
     */
    boolean isUsernameExists(String username, Long excludeId);

    /**
     * 检查邮箱是否存在
     *
     * @param email     邮箱
     * @param excludeId 排除的用户ID（用于更新时检查）
     * @return 是否存在
     */
    boolean isEmailExists(String email, Long excludeId);

    /**
     * 检查手机号是否存在
     *
     * @param phone     手机号
     * @param excludeId 排除的用户ID（用于更新时检查）
     * @return 是否存在
     */
    boolean isPhoneExists(String phone, Long excludeId);

    /**
     * 获取用户统计信息
     *
     * @return 统计信息
     */
    UserStatistics getUserStatistics();

    /**
     * 用户统计信息内部类
     */
    class UserStatistics {
        private Long totalUsers;
        private Long activeUsers;
        private Long inactiveUsers;
        private Long adminUsers;
        private Long normalUsers;

        // 构造函数、getter和setter方法
        public UserStatistics() {
        }

        public UserStatistics(Long totalUsers, Long activeUsers, Long inactiveUsers, Long adminUsers,
                Long normalUsers) {
            this.totalUsers = totalUsers;
            this.activeUsers = activeUsers;
            this.inactiveUsers = inactiveUsers;
            this.adminUsers = adminUsers;
            this.normalUsers = normalUsers;
        }

        public Long getTotalUsers() {
            return totalUsers;
        }

        public void setTotalUsers(Long totalUsers) {
            this.totalUsers = totalUsers;
        }

        public Long getActiveUsers() {
            return activeUsers;
        }

        public void setActiveUsers(Long activeUsers) {
            this.activeUsers = activeUsers;
        }

        public Long getInactiveUsers() {
            return inactiveUsers;
        }

        public void setInactiveUsers(Long inactiveUsers) {
            this.inactiveUsers = inactiveUsers;
        }

        public Long getAdminUsers() {
            return adminUsers;
        }

        public void setAdminUsers(Long adminUsers) {
            this.adminUsers = adminUsers;
        }

        public Long getNormalUsers() {
            return normalUsers;
        }

        public void setNormalUsers(Long normalUsers) {
            this.normalUsers = normalUsers;
        }
    }
}